<?php
class Zen_Front extends Zen_Dependency
{
    protected $_Zen_Front = array(
        'module_default'=>'',
        'action_default'=> '',
        'dependency' => 'Zen_Module',
        //执行动作前后的钩子
        'pre_action' => array(),
        'post_action' => array(),
    );

    final public function fetch($module=null, $action=null)
    {
        $v_path = $this->_dependency->getVendor();
        $m_path = $this->_dependency->getModule();

        //判断布局文件配置
        $lyt = isset($this->_config['layout_'.$module.'_'.$action])
                        ? $this->_config['layout_'.$module.'_'.$action]
                        : $this->_config['layout_default'];
       
        //Hook Pre Action
        Zen::callbacks($this->_config['pre_action']);  
              
        //启用缓存输出
        ob_start();
        
        //执行动作
        require_once($m_path."/$action.php");
        
        //Hook Post Action
        Zen::callbacks($this->_config['post_action']);
        
        //获取视图内容
        $content = ob_get_contents();
        
        //如果不使用布局，则直接返回主体内容
        if (false === $lyt) {
            ob_end_clean();
            return $content;
        } else {
            //清除之前的输出
            ob_clean();

            //查找布局文件
            if (file_exists($m_path."/Views/$lyt.lyt.php")) {
                //查找本地
                require_once($m_path."/Views/$lyt.lyt.php");
            } else if (file_exists($v_path."/../../Views/$lyt.lyt.php")) {
                //查找用户空间
                require_once($v_path."/../../Views/$lyt.lyt.php");
            } else if (file_exists(Zen::$system."/zen/Views/$lyt.lyt.php")) {
                //查找Zen空间
                require_once(Zen::$system."/zen/Views/$lyt.lyt.php");
            } else {
                //查找失败，抛出异常
                throw $this->_exception("ERR_NO_EXIST_LAYOUT", array('lyt'=>$lyt));

            }
            //获得布局内容
            $layout = ob_get_contents();
            //结束并清理输出缓冲
            ob_end_clean();

            return str_replace('{%body%}', $content, $layout);
        }
    }
}